/*--------------widget.h--------------*/
float IEEE754(quint16 reg1, quint16 reg2)
// reg1:寄存器1,reg2:寄存器2
/*--------------widget.cpp--------------*/
float Widget::IEEE754(quint16 reg1, quint16 reg2)
{
// 存储原始字节数据的容器(4字节)
QVector rawBytes;
// 拆分第 1 个寄存器(高2字节)
uint8_t high1 = (reg1 >> 8) & 0xFF;
uint8_t low1 = reg1 & 0xFF;
rawBytes.append(high1);
rawBytes.append(low1);
// 拆分第 2 个寄存器(低2字节)
uint8_t high2 = (reg2 >> 8) & 0xFF;
uint8_t low2 = reg2 & 0xFF;
rawBytes.append(high2);
rawBytes.append(low2);
// 确保有4字节数据
if (rawBytes.size() != 4) {
qDebug() << "数据错误,需要4字节才能转换为浮点数";
return NAN;
}
// 转换为const uint8_t*(使用data()方法)
const uint8_t* bytePtr = rawBytes.data();
// 验证指针有效性
if (bytePtr == nullptr) {
throw std::invalid_argument("输入字节数组不能为空");
}
// 组合4字节为32位无符号整数(大端模式)
uint32_t rawData = (static_cast(bytePtr[0]) << 24) |
(static_cast(bytePtr[1]) << 16) |
(static_cast(bytePtr[2]) << 8) |
static_cast(bytePtr[3]);
// 提取符号位 (第31位)
const bool sign = (rawData & 0x80000000) != 0;
// 提取符号位 (第31位)
const uint8_t expBits = static_cast((rawData >> 23) & 0xFF);
// 提取尾数位 (第0-22位)
const uint32_t mantissaBits = rawData & 0x7FFFFF;
// 处理特殊值情况
if (expBits == 0xFF) {
if (mantissaBits == 0) { return sign ? -INFINITY : INFINITY; } // 无穷大
else { return NAN; } // 非数(NaN)
}
// 计算指数和尾数
int32_t exponent; float mantissa;
if (expBits == 0) {
// 非规格化数
exponent = -126;
mantissa = static_cast(mantissaBits) / (1 << 23);
} else {
// 规格化数
exponent = static_cast(expBits) - 127;
mantissa = 1.0f + static_cast(mantissaBits) / (1 << 23);
}
// 计算最终结果
float result = (sign ? -1.0f : 1.0f) * mantissa * std::pow(2.0f, exponent);
return result;
}